package TestPractice;

import org.junit.Test;



/**
 * @author Jiang Zhiyan
 *
 * 2021年6月9日 上午10:09:37
 *
 */
public class ParentTest {
	@Test
	public void test02() {
	   Child c1 = new Child();
	   Parent p1 = new  Parent();
	   GrandParent g1 = new GrandParent();
	   Parent p2=c1; //向上转型-自动
//	   Child c2=(Child)p1;  //向下转型-强转  报错-运行时类型应为其类或子类类型
	   GrandParent g2=c1;  //左为父类，右为孙类
	   Parent c3= (Child)g2;  
	   
//	 //强制转换不会报错（向下转型）
//	   Child c2=(Child)p1;   //编译通过，运行时报错ClassCaseException 类型转换的异常
//	   //父类类型的实例必须是子类类型。
//	   Parent p3=new Child();  //区别在于p3运行时类型为子类类型
//	   Child c3=(Child)p3;
//	// value  instanceof Type 作用是判断一个变量（value）的实际运行时的类型是否为Type或者Type的子类，如果时，返回True
//	   System.out.println(p1 instanceof Child);//flase  编译时类型为父类，运行时类型为父类
//	   System.out.println(p3 instanceof Child);//true   编译时类型为父类，运行时类型为子类   
	}
}
//爷类
class GrandParent{
	int x;
	public void GrandParent() {
		
	}
}

//父类
class Parent extends GrandParent{
 int x;
 int y;
public void show() {
	  System.out.println("parent");
}
public long add(long a,long b) {
	  return a+b;
}
}
//子类
class Child extends Parent{
   	 int child;
   	 /**
   	  * 方法重写 @Override
   	  * 
   	  * 1.子类对父类非私有的方法进行重新定义。
   	  * 2.java中可以使用@Override注解方法判断该方法是否为重写
   	  * 
   	  * 方法重写的规则
   	  * 
   	  * 1.重写方法名 和 参数类型列表 必须和父类的方法完全一致
   	  * 2.重写的方法的 返回值类型 必须与父类方法的返回值类型一致
   	  * 3.重写的方法的 访问修饰符 必须大于等于父类的方法访问修饰符
   	  */
   	public void show() {
   		System.out.println("child");
   	}
   	@Override   //判断此下方法是否为方法重写
   	public long add(long a,long b) {
   		return a*b;
   	}
}
